科技新知
Swarm mode 上線 5 - load balancer | 負載平衡器
前面我們一直談 swarm 的設定,但對於真實的服務,我們還要考慮客戶端是如何連接我們的伺服器群集。通常網路服務,客戶端都會經過域名轉換成IP,然而通過IP連線服務。
假設我們 swarm 內有5個節點,那到底域名應該指向我們哪一個節點的 IP 呢?
如果我們不考慮節點死機的話,其實5個節點的IP都可以。因為 swarm 會自動把同一個公開的 port ,在每一個節點上都可以訪問到。
以下例子,即使只有一個 container 運行,佔用 port 8888,它還是會在5個節點上全開。 swarm 通過自己的 ingress network,它所有節點的 8888 串連起來。
services:
http:
image: bretfisher/httpenvports:
- 8888:8888deploy:
replicas: 1update_config:
delay: 10srestart_policy:
condition: on-failure
我們可以在每個節點上,都會找到這個 ingress network,而且那個Network ID,應該是一樣的
> docker network ls | grep ingress
t7rmk6g9zybm ingress overlay swarm
如果上述的 service 的 replicas 調成大於1的數量, ingress network 還會方便地自動 round robin (輪替) 地分派流量,達到最簡單的負載平衡。
前述的設定,我們有一最大的假設,就是節點不會死機。但實際情況下,各種原因,例如安全性更新、重啟中,都會讓節點暫時無法使用。即使所有 service 都是會自動 failover (故障轉移),但客戶端還是用舊機 IP ,它還是無法訪問。因為該機 IP 已無法使用,除非我們連 IP 也懂 failover。這時, Virtual IP 就是我們的救命靈藥。
在 ubuntu 上,我們可以經過 keepalived 去設定 Virtual IP
apt-get update && apt-get install keepalived -y
然後設定 keepalived , 假設 172.22.1.5 是我們的 Virtual IP 。 然後每個節點都要加入conf
# vim /etc/keepalived/keepalived.conf
# assume failover ip is 172.22.1.5
vrrp_instance VI_1 {
# change interface according to machine status
interface eth1
state MASTER
# 101 for node1, 102 for node2
# you can start seq from other value, remind unqiue for each node is ok;
virtual_router_id 101
# lower value will become master
# ex, node1 priority 100, node2 priority 200, node3 priority 150.
# if node 1, 2, 3 alive, node2 will become master.
# if node 2 gone, node 3 will become master.
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass YOUR_RANDOM_PASSWORD
}
virtual_ipaddress {
172.22.1.5
}
}
上述需要特別注意的是
- virtual_router_id : 每個節點應該都要不一樣,以作唯一標識。
- priority : 每個節點應該都要不一樣,最大的那個節點,就會優先使用 Virtual IP 。
- auth_pass : 每個節點都相同,但大家在抄時,記得更改。
還有的是開通 iptables ,讓各個節點可以經網絡廣播的方式互相看到對方。
iptables -I INPUT -d 224.0.0.0/8 -j ACCEPT
iptables -I INPUT -p vrrp -j ACCEPT
systemctl restart keepalived